REM >RunFilerAc
REM (C) Nick Craig-Wood 1994
REM This is for starting off Filer_Action tasks
REM It expects <Dir> <Leaf> and <Path> to be set up
REM Modifications by Philip Ludlam
REM Version 1.02 21 May 2003

buffer_size%=1024
DIM buffer% buffer_size%

ON ERROR: ON ERROR OFF: ERROR EXT ERR,REPORT$+" at "+STR$ ERL

SYS "OS_GetEnv" TO env%

SYS "OS_ReadArgs",",quit=load,/E,/G,value/E,recurse/s,dontproxy/s",env%,buffer%,buffer_size%

type%=FNeval(buffer%!8)
to$=FNgstrans(buffer%!12)
value%=FNeval(buffer%!16)
recurse%=buffer%!20
dontproxy%=buffer%!24

IF type%=-1 THEN ERROR 1,"Syntax: *RunFilerAc <type> [<to>] [-value <bits>] [-recurse] [-dontproxy]"

SYS "Wimp_Initialise",310,&4B534154,"RunFilerAction" TO ,taskID%
ON ERROR: ON ERROR OFF: PROCclosedown: ERROR EXT ERR,REPORT$+" at "+STR$ ERL

next$=FNvar("Director$NextSlot")
IF next$<>"" next%=EVAL("0+"+FNvar("Director$NextSlot"))
IF next$<>"" SYS "Wimp_SlotSize",-1,next%

SYS "Wimp_StartTask","Filer_Action" TO handle%

SYS "FilerAction_SendSelectedDirectory",handle%,FNvar("Dir")+CHR$(0)

SYS "FilerAction_SendSelectedFile",handle%,FNvar("Leaf")+CHR$(0)

SYS "OS_Byte",&A1,&C6 TO ,,bits%
bits% = ((bits% AND &40) >> 6) OR ((bits% AND &20) >> 4) OR ((bits% AND &10) >> 2) OR ((bits% AND &80) >> 4)
IF recurse% bits%+=1<<4
IF dontproxy% bits%+=1<<7

!buffer%=value%
value%=buffer%

IF to$="" THEN
  SYS "FilerAction_SendStartOperation",handle%,type%,bits%,value%,4
ELSE
  SYS "FilerAction_SendStartOperation",handle%,type%,bits%,to$+CHR$(0),LEN(to$)+1
ENDIF

PROCclosedown
END

DEF PROCclosedown
  SYS "Wimp_CloseDown"
ENDPROC

DEF FNvar(var$)
LOCAL a$,i$,len%,f%
SYS "XOS_ReadVarVal",var$,buffer%,buffer_size%,0,3 TO ,,len%;f%
IF (f% AND 1)<>0 THEN =""
buffer%?len%=&D
=$buffer%

DEF FNgstrans(p%)
LOCAL i%,a$
IF p%=0 THEN =""
  len%=(!p%) AND &FFFF
  a$=""
  FOR i%=2 TO 2+len%-1
    a$+=CHR$(p%?i%)
  NEXT i%
=a$

DEF FNeval(p%)
IF p%=0 THEN =-1
=p%!1
